/*
    Copyright 2000-2011 Francois de Bertrand de Beuvron

    This file is part of CoursBeuvron.

    CoursBeuvron is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    CoursBeuvron is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with CoursBeuvron.  If not, see <http://www.gnu.org/licenses/>.
 */

package fr.insa.glaizot;

import java.awt.Graphics;
import java.awt.Image;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.JPanel;

/**
 * Une petite classe permettant d'afficher une image dans un panel.
 * 
 * @author Francois
 */
public class ImagePanel extends JPanel {

    /**
     * l'image a afficher
     */
    public Image image;
    /**
     * le mode de dessin de l'image :
     * drawType = 0 : l'image est dessinï¿½e avec sa taille originale
     * drawType = 1 : l'image est dessinï¿½e ï¿½ la taille du panneau
     * drawType = 2 : l'image est dessinï¿½e ï¿½ sa taille originale, et
     *   recopiï¿½e comme une mozaique pour recouvrir tout le panneau
     */
    public int drawType = 1;

    /**
     * crï¿½e un image panel avec l'image par dï¿½faut (un petit smiley)
     */
    public ImagePanel() {
        this.chargeImageRelatif("Firefox_wallpaper.png");
    }

    /**
     * crï¿½e un image panel pour l'image dont le nom de fichier est passï¿½
     * en paramï¿½tre.
     * @param imgPath chemin du fichier relatif au rï¿½pertoire contenant la
     * classe.
     */
    public ImagePanel(String imgPath) {
        this.chargeImageRelatif(imgPath);
    }

    public ImagePanel(Image img) {
        this.image = img;
    }

    /**
     * charge l'image associï¿½e ï¿½ ce panel ï¿½ partir d'un fichier.
     * Le nom du fichier est relatif au rï¿½pertoire qui contient la classe
     * (utilisation de getRessource)
     *
     * @param imgPath chemin du fichier relatif au rï¿½pertoire contenant la
     * classe.
     */
    public void chargeImageRelatif(String imgPath) {
        URL pathComplet = this.getClass().getResource(imgPath);
        if (pathComplet != null) {
            try {
                this.image = ImageIO.read(pathComplet);
                this.repaint();
            } catch (IOException ex) {
                this.image = null;
                throw new Error("impossible de charger l'image : " + imgPath);
            }
        } else {
            this.image = null;
            throw new Error("Image non trouvï¿½e : " + imgPath);
        }
    }

    /**
     * charge l'image associï¿½e ï¿½ ce panel ï¿½ partir d'un fichier.
     * Le nom du fichier est soit un chemin absolu (ie "/home/sth/toto/monImage.jpg")
     * soit un chemin relatif par rapport au dossier par dï¿½faut ou s'execute le programme.
     * Comme ce dossier d'execution du programme peut varier, il vaut mieux soit
     * utiliser un chemin absolu, soit utiliser la mï¿½thode chargeImageRelatif.
     *
     * @param imgPath chemin du fichier
     */
    public void chargeImageAbsolue(String imgPath) {
        File f = new File(imgPath);
        try {
            this.image = ImageIO.read(f);
            this.repaint();
        } catch (IOException ex) {
            this.image = null;
            throw new Error("impossible de charger l'image : " + imgPath);
        }
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (this.image != null) {
            if (this.drawType == 1) {
                // dessin de l'image ï¿½ la taille du panneau
                g.drawImage(this.image,
                        0, 0, this.getWidth(), this.getHeight(),
                        this);

            } else if (this.drawType == 0) {
                // dessin de l'image ï¿½ sa taille originale
                g.drawImage(this.image,
                        0, 0,
                        this);

            } else if (this.drawType == 2) {
                // dessin de l'image en mozaique
                int isx = this.image.getWidth(this);
                int isy = this.image.getHeight(this);
                int psx = this.getWidth();
                int psy = this.getHeight();
                if (isx > 0 && isy > 0) {
                    int nbrx = (int) Math.ceil(((double) psx) / isx);
                    int nbry = (int) Math.ceil(((double) psy) / isy);
                    for (int i = 0; i < nbrx; i++) {
                        for (int j = 0; j < nbry; j++) {
                            g.drawImage(this.image,
                                    i * isx, j * isy, isx, isy,
                                    this);

                        }
                    }
                }
            } else {
                throw new Error("unexpected draw type : " + this.drawType);
            }
        }
    }

    public Image getImage() {
        return image;
    }

    public void setImage(Image image) {
        this.image = image;
        this.repaint();
    }

    /**
     * @return the drawType
     */
    public int getDrawType() {
        return drawType;
    }

    /**
     * @param drawType the drawType to set
     */
    public void setDrawType(int drawType) {
        this.drawType = drawType;
        this.repaint();
    }

    public static void main(String[] args) {
        ImagePanel p1 = new ImagePanel("Firefox_wallpaper.png");
        TestePanel.tailleFixee("panel size", p1, 400, 200);
        ImagePanel p2 = new ImagePanel("Firefox_wallpaper.png");
        p2.setDrawType(0);
        TestePanel.tailleFixee("image size", p2, 400, 200);
        ImagePanel p3 = new ImagePanel("Firefox_wallpaper.png");
        p3.setDrawType(2);
        TestePanel.tailleFixee("mozaic", p3, 400, 200);
    }
}
